package com.yupi.project.controller;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yupi.project.annotation.AuthCheck;
import com.yupi.project.common.BaseResponse;
import com.yupi.project.common.ErrorCode;
import com.yupi.project.common.ResultUtils;
import com.yupi.project.exception.BusinessException;
import com.yupi.project.mapper.UserInterfaceInfoMapper;
import com.yupi.project.model.vo.InterfaceInfoVO;
import com.yupi.project.service.InterfaceInfoService;
import com.yupi.yuapicommon.model.entity.InterfaceInfo;
import com.yupi.yuapicommon.model.entity.UserInterfaceInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 分析控制器
 
 */
@RestController
@RequestMapping("/analysis")
@Slf4j
public class AnalysisController {

    @Resource
    private UserInterfaceInfoMapper userInterfaceInfoMapper;

    @Resource
    private InterfaceInfoService interfaceInfoService;

    @GetMapping("/top/interface/invoke")
    @AuthCheck(mustRole = "admin")
    public BaseResponse<List<InterfaceInfoVO>> listTopInvokeInterfaceInfo() {
        List<UserInterfaceInfo> userInterfaceInfoList = userInterfaceInfoMapper.listTopInvokeInterfaceInfo(3);
        // 代码首先将userInterfaceInfoList列表转换为Java 8的Stream对象。
        // 接着，它通过Collectors.groupingBy()方法对UserInterfaceInfo对象按照getInterfaceInfoId()方法的返回值进行分组。
        // 这将创建一个Map，其中键是UserInterfaceInfo对象的interfaceInfoId属性，
        // 值是具有相同interfaceInfoId属性值的UserInterfaceInfo对象列表。
        // 换句话说，它将所有具有相同interfaceInfoId的对象分组在一起。
        Map<Long, List<UserInterfaceInfo>> interfaceInfoIdObjMap = userInterfaceInfoList.stream()
                .collect(Collectors.groupingBy(UserInterfaceInfo::getInterfaceInfoId));
        // 接着，它使用interfaceInfoIdObjMap的键集合作为过滤条件，即将以这些键（interfaceInfoId）为值的记录筛选出来。
        // 这样，查询将只返回那些InterfaceInfo对象，其id属性与interfaceInfoId匹配的键相同。
        // 最终，该代码的目的是从数据库中检索与interfaceInfoIdObjMap中的键对应的InterfaceInfo记录。
        QueryWrapper<InterfaceInfo> queryWrapper = new QueryWrapper<>();
        queryWrapper.in("id", interfaceInfoIdObjMap.keySet());
        List<InterfaceInfo> list = interfaceInfoService.list(queryWrapper);
        if (CollectionUtils.isEmpty(list)) {
            throw new BusinessException(ErrorCode.SYSTEM_ERROR);
        }
        // 代码使用Java 8的Stream API对查询得到的InterfaceInfo列表进行处理。
        // 通过map()方法，它将每个InterfaceInfo对象转换为相应的InterfaceInfoVO对象，进行数据映射。
        // 在这里，InterfaceInfoVO是一个可能是前端展示使用的值对象，用于展示接口信息。
        // 使用BeanUtils.copyProperties()方法，它将InterfaceInfo对象的属性复制到InterfaceInfoVO对象中，从而实现了数据的拷贝。
        // 然后，它从interfaceInfoIdObjMap中获取与当前InterfaceInfo对象对应的总数（在之前的处理中已经将相关信息放入interfaceInfoIdObjMap），
        // 并设置到InterfaceInfoVO对象的totalNum属性中。最后，通过collect(Collectors.toList())方法，将转换后的InterfaceInfoVO对象列表收集起来。
        List<InterfaceInfoVO> interfaceInfoVOList = list.stream().map(interfaceInfo -> {
            InterfaceInfoVO interfaceInfoVO = new InterfaceInfoVO();
            BeanUtils.copyProperties(interfaceInfo, interfaceInfoVO);
            int totalNum = interfaceInfoIdObjMap.get(interfaceInfo.getId()).get(0).getTotalNum();
            interfaceInfoVO.setTotalNum(totalNum);
            return interfaceInfoVO;
        }).collect(Collectors.toList());
        return ResultUtils.success(interfaceInfoVOList);
    }
}
